from plane_sprites import *


class PlaneGame(object):
    def __init__(self):
        # 游戏初始化
        # 1.创建游戏窗口pygame.display.set_mode
        self.screen = pygame.display.set_mode(SCREEN.size)
        # 2.创建游戏时钟pygame.time.Clock()
        self.clock = pygame.time.Clock()
        # 3.创建精灵和精灵组内容较多 故封装成一个方法
        # 调用创建精灵的方法
        self.__create_sprite()
        pygame.time.set_timer(CREATE_EVENT, 800)
        # 4.设置定时器 每隔多少秒创建一个敌机
        pygame.time.set_timer(BULLET_EVENT, 500)

    def star_game(self):
        while True:
            self.clock.tick(60)
            self.__update_sprite()
            pygame.display.update()
            self.__event_handler()
            self.__check_collide()


    def __create_sprite(self):
        # 创建背景
        bg1 = BackGround()
        bg2 = BackGround(True)
        self.bg_group = pygame.sprite.Group(bg1, bg2)
        # 创建敌机
        self.enemy_group = pygame.sprite.Group()
        # 创建战机
        self.hero = Hero()
        self.hero_group = pygame.sprite.Group(self.hero)
        self.hero.bullet_gp = pygame.sprite.Group()

    #  更新位置
    def __update_sprite(self):
        # 更新背景图片位置
        self.bg_group.update()
        self.bg_group.draw(self.screen)
        # 更新敌机位置
        self.enemy_group.update()
        self.enemy_group.draw(self.screen)
        # 更新战机位置
        self.hero_group.update()
        self.hero_group.draw(self.screen)
        #  更新子弹位置
        self.hero.bullet.update()
        self.hero.bullet.draw(self.screen)

    def __event_handler(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:  # 当事件为退出事件，则退出游戏
                print("游戏结束")
                pygame.quit()  # 卸载所有模块
                exit()  # 退出整个系统
            elif event.type == CREATE_EVENT:  # 当事件为定时器发生的，则创建一个敌机
                enemy1 = Enemy()
                self.enemy_group.add(enemy1)
            elif event.type == BULLET_EVENT:
                self.hero.fire()
        keys_press = pygame.key.get_pressed()
        # 键盘操作战机左右移动
        if keys_press[pygame.K_RIGHT]:  # 按下右键
            self.hero.speed = 3
        elif keys_press[pygame.K_LEFT]:  # 按下左键
            self.hero.speed = -3
        else:
            self.hero.speed = 0

    def __check_collide(self):
        # 子弹摧毁敌机
        pygame.sprite.groupcollide(self.hero.bullet, self.enemy_group, True, True)
        # 敌机碰撞战机
        bullet_list = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)
        if len(bullet_list) != 0:
            self.hero.kill()
            PlaneGame.game_over()

    @staticmethod
    def game_over():
        pygame.quit()

if __name__ == "__main__":
    game = PlaneGame()
    game.star_game()